package co.com.tye.presentation.backingBeans;

import co.com.tye.exceptions.*;
import co.com.tye.modelo.*;
import co.com.tye.modelo.dto.CriteriosDTO;
import co.com.tye.presentation.businessDelegate.*;
import co.com.tye.utilities.*;

import org.primefaces.component.calendar.*;
import org.primefaces.component.commandbutton.CommandButton;
import org.primefaces.component.inputtext.InputText;
import org.primefaces.component.selectonemenu.SelectOneMenu;
import org.primefaces.event.RowEditEvent;

import java.io.Serializable;
import java.sql.*;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Set;
import java.util.TimeZone;

import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import javax.faces.model.SelectItem;

/**
 * @author Zathura Code Generator http://code.google.com/p/zathura/
 *         www.zathuracode.org
 *
 */
@ManagedBean
@ViewScoped
public class CriteriosView implements Serializable {
	private static final long serialVersionUID = 1L;
	// descripcion del criterio
	private InputText txtDescripcion;
	// id del tipo de criterio al que pertenece
	private InputText txtIdtipoCriterios_TipoCriterios;
	// id del criterio
	private InputText txtIdcriterios;

	private CommandButton btnSave;
	private CommandButton btnModify;
	private CommandButton btnDelete;
	private CommandButton btnClear;

	private SelectOneMenu selectOneMenuTipoCriterios;

	private List<TipoCriterios> losTiposCriterios;
	private List<SelectItem> losTiposCriteriosItems;
	private String stringTipoCriterios;

	// una lista de criteriosDTO
	private List<CriteriosDTO> data;
	// DTO creado para tomar los valores de un criterio seleccionado o
	// recuperado
	// por un listener
	private CriteriosDTO selectedCriterios;
	// entidad creada para mandarla al bussinesdelegate
	private Criterios entity;

	private boolean showDialog;
	@ManagedProperty(value = "#{BusinessDelegatorView}")
	private IBusinessDelegatorView businessDelegatorView;

	public CriteriosView() {
		super();
	}

	public void rowEventListener(RowEditEvent e) {
		try {
			CriteriosDTO criteriosDTO = (CriteriosDTO) e.getObject();

			if (txtDescripcion == null) {
				txtDescripcion = new InputText();
			}

			txtDescripcion.setValue(criteriosDTO.getDescripcion());

			if (txtIdtipoCriterios_TipoCriterios == null) {
				txtIdtipoCriterios_TipoCriterios = new InputText();
			}

			txtIdtipoCriterios_TipoCriterios.setValue(criteriosDTO
					.getIdtipoCriterios_TipoCriterios());

			if (txtIdcriterios == null) {
				txtIdcriterios = new InputText();
			}

			txtIdcriterios.setValue(criteriosDTO.getIdcriterios());

			Integer idcriterios = FacesUtils.checkInteger(txtIdcriterios);
			entity = businessDelegatorView.getCriterios(idcriterios);

			action_modify();
		} catch (Exception ex) {
		}
	}

	public String action_new() {
		action_clear();
		selectedCriterios = null;
		setShowDialog(true);

		return "";
	}

	public String action_clear() {
		entity = null;
		selectedCriterios = null;

		if (txtIdtipoCriterios_TipoCriterios != null) {
			txtIdtipoCriterios_TipoCriterios.setValue(null);
			txtIdtipoCriterios_TipoCriterios.setDisabled(true);
		}

		if (txtDescripcion != null) {
			txtDescripcion.setValue(null);
			txtDescripcion.setDisabled(false);
		}

		if (txtIdtipoCriterios_TipoCriterios != null) {
			txtIdtipoCriterios_TipoCriterios.setValue(null);
			txtIdtipoCriterios_TipoCriterios.setDisabled(false);
		}

		if (btnSave != null) {
			btnSave.setDisabled(false);
		}

		if (btnDelete != null) {
			btnDelete.setDisabled(false);
		}

		return "";
	}

	

	public String action_edit(ActionEvent evt) {
		selectedCriterios = (CriteriosDTO) (evt.getComponent().getAttributes()
				.get("selectedCriterios"));

		txtDescripcion.setValue(selectedCriterios.getDescripcion());
		txtDescripcion.setDisabled(false);

		btnSave.setDisabled(false);
		setShowDialog(true);

		return "";
	}

	public String action_save() {
		try {
			if ((selectedCriterios == null) && (entity == null)) {
				action_create();
			} else {
				action_modify();
			}

			data = null;
		} catch (Exception e) {
			FacesUtils.addErrorMessage(e.getMessage());
		}

		return "";
	}

	public String action_create() {
		try {
			entity = new Criterios();
			entity.setIdcriterios(1);
			entity.setEstadoRegistro("activo");
			entity.setFechaCreacion(new Date());
			entity.setDescripcion(FacesUtils.checkString(txtDescripcion));
			
			entity.setTipoCriterios(businessDelegatorView
					.getTipoCriterios(Integer.parseInt(stringTipoCriterios)));
			// entity.setUsuarioCreador(FacesUtils.getfromSession("user").toString());
			
			businessDelegatorView.saveCriterios(entity);
			FacesUtils.addInfoMessage(ZMessManager.ENTITY_SUCCESFULLYSAVED);
			action_clear();
		} catch (Exception e) {
			entity = null;
			FacesUtils.addErrorMessage(e.getMessage());
		}

		return "";
	}

	public String action_modify() {
		try {
			if (entity == null) {
				Integer idcriterios = new Integer(
						selectedCriterios.getIdcriterios());
				entity = businessDelegatorView.getCriterios(idcriterios);
			}

			entity.setDescripcion(FacesUtils.checkString(txtDescripcion));

			entity.setTipoCriterios(businessDelegatorView.getTipoCriterios(Integer.parseInt(stringTipoCriterios)));
			
			businessDelegatorView.updateCriterios(entity);
			FacesUtils.addInfoMessage(ZMessManager.ENTITY_SUCCESFULLYMODIFIED);
		} catch (Exception e) {
			data = null;

			FacesUtils.addErrorMessage(e.getMessage());
		}

		return "";
	}

	public String action_delete_datatable(ActionEvent evt) {
		try {
			selectedCriterios = (CriteriosDTO) (evt.getComponent()
					.getAttributes().get("selectedCriterios"));

			Integer idcriterios = new Integer(
					selectedCriterios.getIdcriterios());
			entity = businessDelegatorView.getCriterios(idcriterios);
			action_delete();
		} catch (Exception e) {
			FacesUtils.addErrorMessage(e.getMessage());
		}

		return "";
	}

	public String action_delete_master() {
		try {
			action_delete();
		} catch (Exception e) {
			FacesUtils.addErrorMessage(e.getMessage());
		}

		return "";
	}

	public void action_delete() throws Exception {
		try {
			businessDelegatorView.deleteCriterios(entity);
			FacesUtils.addInfoMessage(ZMessManager.ENTITY_SUCCESFULLYDELETED);
			action_clear();
			data = null;

		} catch (Exception e) {
			throw e;
		}
	}

	public String action_closeDialog() {
		setShowDialog(false);
		action_clear();

		return "";
	}

	public String actionDeleteDataTableEditable(ActionEvent evt) {
		try {
			selectedCriterios = (CriteriosDTO) (evt.getComponent()
					.getAttributes().get("selectedCriterios"));

			Integer idcriterios = new Integer(
					selectedCriterios.getIdcriterios());
			entity = businessDelegatorView.getCriterios(idcriterios);
			businessDelegatorView.deleteCriterios(entity);
			data.remove(selectedCriterios);
			FacesUtils.addInfoMessage(ZMessManager.ENTITY_SUCCESFULLYDELETED);
			action_clear();
		} catch (Exception e) {
			FacesUtils.addErrorMessage(e.getMessage());
		}

		return "";
	}

	public String action_modifyWitDTO(String descripcion,
			String estadoRegistro, Date fechaCreacion,
			Date fechaUltimaModificacion, Integer idcriterios,
			String usuarioCreador, String usuarioUltimaModificacion,
			Integer idtipoCriterios_TipoCriterios) throws Exception {
		try {
			entity.setDescripcion(FacesUtils.checkString(descripcion));
			entity.setEstadoRegistro(FacesUtils.checkString(estadoRegistro));
			entity.setFechaCreacion(FacesUtils.checkDate(fechaCreacion));
			entity.setFechaUltimaModificacion(FacesUtils
					.checkDate(fechaUltimaModificacion));
			entity.setUsuarioCreador(FacesUtils.checkString(usuarioCreador));
			entity.setUsuarioUltimaModificacion(FacesUtils
					.checkString(usuarioUltimaModificacion));
			businessDelegatorView.updateCriterios(entity);
			FacesUtils.addInfoMessage(ZMessManager.ENTITY_SUCCESFULLYMODIFIED);
		} catch (Exception e) {
			FacesUtils.addErrorMessage(e.getMessage());
			throw e;
		}

		return "";
	}

	public InputText getTxtDescripcion() {
		return txtDescripcion;
	}

	public void setTxtDescripcion(InputText txtDescripcion) {
		this.txtDescripcion = txtDescripcion;
	}

	public InputText getTxtIdtipoCriterios_TipoCriterios() {
		return txtIdtipoCriterios_TipoCriterios;
	}

	public void setTxtIdtipoCriterios_TipoCriterios(
			InputText txtIdtipoCriterios_TipoCriterios) {
		this.txtIdtipoCriterios_TipoCriterios = txtIdtipoCriterios_TipoCriterios;
	}

	public InputText getTxtIdcriterios() {
		return txtIdcriterios;
	}

	public void setTxtIdcriterios(InputText txtIdcriterios) {
		this.txtIdcriterios = txtIdcriterios;
	}

	public List<CriteriosDTO> getData() {
		try {
			if (data == null) {
				data = businessDelegatorView.getDataCriterios();
			}
		} catch (Exception e) {
			e.printStackTrace();
		}

		return data;
	}

	public void setData(List<CriteriosDTO> criteriosDTO) {
		this.data = criteriosDTO;
	}

	public CriteriosDTO getSelectedCriterios() {
		return selectedCriterios;
	}

	public void setSelectedCriterios(CriteriosDTO criterios) {
		this.selectedCriterios = criterios;
	}

	public CommandButton getBtnSave() {
		return btnSave;
	}

	public void setBtnSave(CommandButton btnSave) {
		this.btnSave = btnSave;
	}

	public CommandButton getBtnModify() {
		return btnModify;
	}

	public void setBtnModify(CommandButton btnModify) {
		this.btnModify = btnModify;
	}

	public CommandButton getBtnDelete() {
		return btnDelete;
	}

	public void setBtnDelete(CommandButton btnDelete) {
		this.btnDelete = btnDelete;
	}

	public CommandButton getBtnClear() {
		return btnClear;
	}

	public void setBtnClear(CommandButton btnClear) {
		this.btnClear = btnClear;
	}

	public TimeZone getTimeZone() {
		return java.util.TimeZone.getDefault();
	}

	public IBusinessDelegatorView getBusinessDelegatorView() {
		return businessDelegatorView;
	}

	public void setBusinessDelegatorView(
			IBusinessDelegatorView businessDelegatorView) {
		this.businessDelegatorView = businessDelegatorView;
	}

	public boolean isShowDialog() {
		return showDialog;
	}

	public void setShowDialog(boolean showDialog) {
		this.showDialog = showDialog;
	}

	/*
	 * combo tipos Criterios
	 */
	public List<TipoCriterios> getLosTiposCriterios() {
		if (losTiposCriterios == null) {
			try {
				losTiposCriterios = businessDelegatorView.getTipoCriterios();
			} catch (Exception e) {
				// TODO: handle exception
			}
		}

		return losTiposCriterios;
	}

	public void setLosTiposCriterios(List<TipoCriterios> losTiposCriterios) {
		this.losTiposCriterios = losTiposCriterios;
	}

	public List<SelectItem> getLosTiposCriteriosItems() {
		if (losTiposCriteriosItems == null) {
			try {
				losTiposCriteriosItems = new ArrayList<SelectItem>();
				List<TipoCriterios> losTiposCriterios = businessDelegatorView
						.getTipoCriterios();
				for (TipoCriterios tiposCriterios : losTiposCriterios) {
					SelectItem selectItem = new SelectItem(
							tiposCriterios.getIdtipoCriterios(),
							tiposCriterios.getDescripcion());
					losTiposCriteriosItems.add(selectItem);
				}
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		return losTiposCriteriosItems;
	}

	public void setLosTiposCriteriosItems(
			List<SelectItem> losTiposCriteriosItems) {
		this.losTiposCriteriosItems = losTiposCriteriosItems;
	}

	public String getStringTipoCriterios() {
		return stringTipoCriterios;
	}

	public void setStringTipoCriterios(String stringTipoCriterios) {
		this.stringTipoCriterios = stringTipoCriterios;
	}

	public SelectOneMenu getSelectOneMenuTipoCriterios() {
		return selectOneMenuTipoCriterios;
	}

	public void setSelectOneMenuTipoCriterios(
			SelectOneMenu selectOneMenuTipoCriterios) {
		this.selectOneMenuTipoCriterios = selectOneMenuTipoCriterios;
	}

}
